﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using vudu.Logica.Clases;
using vudu.Logica.Excepciones;

namespace vudu.EnlaceDatos.SqlServer
{
    public class SqlServerRol
    {
        #region Atributos

        Conexion _miConexion;

        #endregion

        #region Constructor

        public SqlServerRol()
        {
            _miConexion = new Conexion();
        }

        #endregion

        #region Metodos

        /// <summary>
        /// Este metodo inserta una rol del usuario de la base de datos en funcion al correo y pass
        /// </summary>
        /// <returns>retorna un 1 si la insercion fue exitosa</returns>
        public int InsertarRol(Rol rol )
        {
            int idInsertado = 1;
            return idInsertado;
        }

        /// <summary>
        /// Este metodo realiza la busqueda en la base de datos de la 
        /// universidad en funcion al rol
        /// </summary>
        /// <param name="rolActual"></param>
        /// <returns>
        /// el objeto universidad al cual pertenece el rol
        /// o null si no existe dicha universidad
        /// </returns>
        public Universidad ConsultarUsuarioUniversidad(Rol rolActual)
        {
            Universidad uni = new Universidad("", "", "");
            SqlCommand command = new SqlCommand();

            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SeleccionarUniversidadRol]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idRol", rolActual.Id);
                SqlDataReader reader = command.ExecuteReader();
                if (reader.Read())
                {
                    uni.IdUniv = reader.GetInt32(0);
                    uni.Nombre = reader["nombre"].ToString();
                }
                reader.Close();

            }
            catch (SqlException)
            {
                uni = null;
            }
            catch (NullReferenceException)
            {
                uni = null;
            }
            catch (Exception)
            {
                uni = null;
            }
            finally
            {
                _miConexion.CerrarConexionBd();
            }
            return uni;
        }

        /// <summary>
        /// Este metodo realiza la busqueda en la base de datos de la 
        /// escuela en funcion al rol
        /// </summary>
        /// <param name="rolActual"></param>
        /// <returns>
        /// el objeto Escuela al cual pertenece el rol
        /// o null si no existe dicha escuela
        /// </returns>
        public Escuela ConsultarUsuarioEscuela(Rol rolActual)
        {
            Escuela esc = new Escuela();
            SqlCommand command = new SqlCommand();

            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SeleccionarEscuelaRol]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idRol", rolActual.Id);
                SqlDataReader reader = command.ExecuteReader();
                if (reader.Read())
                {
                    esc.IdEscuela = reader.GetInt32(0);
                    esc.NombreEscuela = reader["nombre"].ToString();
                    esc.DescripcionEscuela = reader["descripcion"].ToString();
                    esc.TelefonoEscuela = reader["telefono"].ToString();
                    esc.EstadoEscuela = reader.GetInt32(4);
                    esc.DireccionEscuela = reader["direccion"].ToString();
                    esc.DirectorEscuela = reader["director"].ToString();

                }
                reader.Close();

            }
            catch (SqlException)
            {
                esc = null;
            }
            catch (NullReferenceException)
            {
                esc = null;
            }
            catch (Exception)
            {
                esc = null;
            }
            finally
            {
                _miConexion.CerrarConexionBd();
            }
            return esc;
        }

        /// <summary>
        /// Este metodo realiza la busqueda en la base de datos del 
        /// profesor en funcion al rol
        /// </summary>
        /// <param name="rolActual"></param>
        /// <returns>
        /// el objeto profesor(datos basicos) al cual pertenece el rol
        /// o null si no existe dicho profesor
        /// </returns>
        public Profesor ConsultarUsuarioProfesor(Rol rolActual)
        {
            Profesor prof = new Profesor();
            SqlCommand command = new SqlCommand();

            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SeleccionarProfesorRol]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idRol", rolActual.Id);
                SqlDataReader reader = command.ExecuteReader();
                if (reader.Read())
                {
                    prof.Cedula = reader.GetInt32(0);
                    prof.Nombre = reader["nombreProfesor"].ToString();
                    prof.Apellido = reader["apellidoProfesor"].ToString();
                    prof.Crn = reader.GetInt32(3);
                    prof.FechaNacimiento = reader.GetDateTime(4);
                    prof.Sexo = reader["sexoProfesor"].ToString();
                    prof.Telefono = reader["telefonoProfesor"].ToString();
                    prof.TiempoLaboral = reader["contratoProfesor"].ToString();
                    prof.Estatus = reader["estadoProfesor"].ToString();
                    prof.EspacioMaxCarga = reader.GetInt32(9);
                    prof.EspacioUtilizado = reader.GetInt32(10);

                }
                reader.Close();

            }
            catch (SqlException)
            {
                prof = null;
            }
            catch (NullReferenceException)
            {
                prof = null;
            }
            catch (Exception)
            {
                prof = null;
            }
            finally
            {
                _miConexion.CerrarConexionBd();
            }
            return prof;
        }

        /// <summary>
        /// Este metodo realiza la busqueda en la base de datos del 
        /// estudiante en funcion al rol
        /// </summary>
        /// <param name="rolActual"></param>
        /// <returns>
        /// el objeto Estudiante al cual pertenece el rol
        /// o null si no existe dicho estudiante
        /// </returns>
        public Estudiante ConsultarUsuarioEstudiante(Rol rolActual)
        {
            Estudiante est = new Estudiante();
            SqlCommand command = new SqlCommand();
            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SeleccionarEstudianteRol]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idRol", rolActual.Id);
                SqlDataReader reader = command.ExecuteReader();
                if (reader.Read())
                {
                    est.IdEst = reader.GetInt32(0);
                    est.Expediente = reader["noExpediente"].ToString();
                    est.Cedula = reader.GetInt32(2);
                    est.Nombre = reader["nombre"].ToString();
                    est.Apellido = reader["apellido"].ToString();
                    est.FechaNacimiento = reader.GetDateTime(5);
                    est.Sexo = reader["sexo"].ToString();
                    est.Telefono = reader["telefono"].ToString();
                    est.Correo = reader["correo"].ToString();
                    est.Carrera = reader["carrera"].ToString();

                }
                reader.Close();

            }
            catch (SqlException)
            {
                est = null;
            }
            catch (NullReferenceException)
            {
                est = null;
            }
            catch (Exception)
            {
                est = null;
            }
            finally
            {
                _miConexion.CerrarConexionBd();
            }
            return est;

        }

        /// <summary>
        /// Este metodo consulta una rol de la base de datos en funcion al correo y pass
        /// </summary>
        /// <returns>retorna un objeto de tipo evaluacion</returns>
        public Rol ConsultarRol(string correo, String pass)
        {
            SqlCommand command = new SqlCommand();
            Rol rol = new Rol();
            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SeleccionarRol]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@NombreUsuario", correo);
                command.Parameters.AddWithValue("@Contrasenha", pass);

                //se ejecuta el comando
                SqlDataReader reader = command.ExecuteReader();
                if (reader.Read())
                {
                    rol.Id = reader.GetInt32(0);
                    rol.Correo = reader.GetString(1);
                    rol.Password = reader.GetString(2);
                    if (rol.Correo.EndsWith("@est.vudu.com"))
                        rol.FkEst = reader.GetInt32(3);
                    if (rol.Correo.EndsWith("@prof.vudu.com"))
                        rol.FkProf = reader.GetInt32(4);
                    if (rol.Correo.EndsWith("@esc.vudu.com"))
                        rol.FkEsc = reader.GetInt32(5);
                    if (rol.Correo.EndsWith("@univ.vudu.com"))
                        rol.FkUniv = reader.GetInt32(6);
                }
                else
                    rol = null;
                reader.Close();
            }
            catch (SqlException)
            {
                rol = null;
            }
            catch (InicioSesionException)
            {
                rol = null;
                throw new InicioSesionException("Error en busqueda de rol");
            }
            //En cualquiera de los casos, finalizo la conexion.
            finally
            {
                _miConexion.CerrarConexionBd();
            }
            return rol;
        }

        /// <summary>
        /// Metodo para consultar si el estudiante tiene rol
        /// </summary>
        /// <param name="ci"> recibe el numero de cedula del estudiante</param>
        /// <returns></returns>
        public bool ConsultarEstudianteRol(int ci)
        {
            SqlCommand command = new SqlCommand();
            bool resp = false;
            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarEstudianteRol]"; // nombre del storedProcedure
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@ciEstudiante", ci); // se hace la consulta por numero de cedula

                SqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                {
                    resp = true;
                }
                else
                {
                    resp = false;
                }

                reader.Close();
                _miConexion.CerrarConexionBd();
            }
            catch (SqlException)
            {
                resp = true;
            }
            catch (NullReferenceException)
            {
                resp = true;
            }
            catch (Exception)
            {
                resp = true;
            }
            finally
            {
                _miConexion.CerrarConexionBd();
            }
            return resp;
        }

        /// <summary>
        /// Metodo para consultar si el profesor tiene rol
        /// </summary>
        /// <param name="ci"> recibe el numero de cedula del profesor</param>
        /// <returns></returns>
        public bool ConsultarProfesorRol(int ci)
        {
            SqlCommand command = new SqlCommand();
            bool resp = false;

            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarProfesorRol]"; // nombre del storedProcedure
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@ciProfesor", ci); // se hace la consulta por numero de cedula

                SqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                {
                    resp = true;
                }
                else
                {
                    resp = false;
                }

                reader.Close();
                _miConexion.CerrarConexionBd();
            }
            catch (SqlException)
            {
                resp = true;
            }
            catch (NullReferenceException)
            {
                resp = true;
            }
            catch (Exception)
            {
                resp = true;
            }
            finally
            {
                _miConexion.CerrarConexionBd();
            }
            return resp;
        }

        /// <summary>
        /// Metodo para consultar que el correo no se repita
        /// </summary>
        /// <param name="correo"> recibe el correo a validar</param>
        /// <returns>si el correo no es utilizado, retorna false
        /// si el correo es utilizado, retorna true</returns>
        public bool ValidarCorreo(string correo)
        {
            SqlCommand command = new SqlCommand();
            bool resp = false;

            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarCorreoRol]";   // nombre del storedProcedure
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@correo", correo); // se hace la consulta por el correo introducido

                SqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                {
                    resp = true;
                }
                else
                {
                    resp = false;
                }

                reader.Close();
                _miConexion.CerrarConexionBd();
            }
            catch (SqlException)
            {
                resp = true;
            }
            catch (NullReferenceException)
            {
                resp = true;
            }
            catch (Exception)
            {
                resp = true;
            }
            finally
            {
                _miConexion.CerrarConexionBd();
            }
            return resp;
        }

        /// <summary>
        /// Metodo que inserta en la base de dato el rol de un estudiante
        /// </summary>
        /// <param name="rolActual"> recibe como parametro el rol del estudiante</param>
        /// <returns> bool </returns>
        public bool InsertarRolEstudiante(Rol rolActual)
        {
            SqlCommand command = new SqlCommand();
            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[InsertarRolEstudiante]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@correo", rolActual.Correo);   ///correo
                command.Parameters.AddWithValue("@clave", rolActual.Password);  ///clave
                command.Parameters.AddWithValue("@fk_est", rolActual.FkEst);    ///id del estudiante

                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                _miConexion.CerrarConexionBd();
                
            }
            catch (SqlException)
            {
                return false;
            }
            catch (NullReferenceException)
            {
                return false;
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                _miConexion.CerrarConexionBd();
            }
            return true;
        }

        /// <summary>
        /// Metodo que inserta en la base de dato el rol de un profesor
        /// </summary>
        /// <param name="rolActual"> recibe como parametro el rol del profesor</param>
        /// <returns> bool </returns>
        public bool InsertarRolProfesor(Rol rolActual)
        {
            SqlCommand command = new SqlCommand();

            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[InsertarRolProfesor]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@correo", rolActual.Correo);   /// correo  
                command.Parameters.AddWithValue("@clave", rolActual.Password);  /// clave
                command.Parameters.AddWithValue("@fk_prof", rolActual.FkProf);  /// cedula del profesor

                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                _miConexion.CerrarConexionBd();
            }
            catch (SqlException)
            {
                return false;
            }
            catch (NullReferenceException)
            {
                return false;
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                _miConexion.CerrarConexionBd();
            }
            return true;
        }

        /// <summary>
        /// Metodo para inserta el rol de Escuela
        /// </summary>
        /// <param name="rolActual">Recibe un rol</param>
        /// <returns>bool</returns>
        public bool InsertarRolEscuela(Rol rolActual)
        {
            SqlCommand command = new SqlCommand();

            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[InsertarRolEscuela]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@correo", rolActual.Correo);   /// correo  
                command.Parameters.AddWithValue("@clave", rolActual.Password);  /// clave
                command.Parameters.AddWithValue("@fk_esc", rolActual.FkEsc);  /// id de la Escuela

                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                _miConexion.CerrarConexionBd();
            }
            catch (SqlException)
            {
                return false;
            }
            catch (NullReferenceException)
            {
                return false;
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                _miConexion.CerrarConexionBd();
            }
            return true;
        }

        /// <summary>
        /// Metodo para inserta el rol de Universidad
        /// </summary>
        /// <param name="rolActual">Recibe un rol</param>
        /// <returns>bool</returns>
        public bool InsertarRolUniversidad(Rol rolActual)
        {
            SqlCommand command = new SqlCommand();

            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[InsertarRolUniversidad]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@correo", rolActual.Correo);   /// correo  
                command.Parameters.AddWithValue("@clave", rolActual.Password);  /// clave
                command.Parameters.AddWithValue("@fk_univ", rolActual.FkUniv);  /// id de la universidad

                SqlDataReader reader = command.ExecuteReader();

                reader.Close();
                _miConexion.CerrarConexionBd();
            }
            catch (SqlException)
            {
                return false;
            }
            catch (NullReferenceException)
            {
                return false;
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                _miConexion.CerrarConexionBd();
            }
            return true;
        }
        
        /// <summary>
        /// CONSULTA SI ALGUN PROFESOR EXISTE PARA PODER REGISTRARLO
        /// </summary>
        /// <param name="ci"> recibe como parametro la ci del profesor</param>
        /// <returns> Retorna true si existe, false si no existe</returns>
        public bool ConsultarUnProfesor(int ci)
        {
            SqlCommand command = new SqlCommand();
            Profesor miProfesor = new Profesor();
            bool resp;

            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarUnProfesor]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@ciProfesor", ci); /// cedula del profesor

                SqlDataReader reader = command.ExecuteReader();

                if (reader.Read())
                {
                    resp = true;
                }
                else
                {
                    resp = false;
                }

                reader.Close();
                _miConexion.CerrarConexionBd();
            }
            catch (SqlException)
            {
                resp = true;
            }
            catch (NullReferenceException)
            {
                resp = true;
            }
            catch (Exception)
            {
                resp = true;
            }
            finally
            {
                _miConexion.CerrarConexionBd();
            }

            return resp;
        }

        /// <summary>
        /// CONSULTA TODAS LAS ESCUELAS QUE NO TIENEN ROL
        /// </summary>
        /// <returns></returns>
        public List<Escuela> ConsultarEscuelasBD()
        {
            List<Escuela> lista = new List<Escuela>(); // declaracion de la lista de universidades

            SqlCommand command = new SqlCommand();

            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarEscuelaRol]"; // nombre del storedProcedure
                command.CommandTimeout = 10;

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Escuela esc = new Escuela(); // se inicializa el objeto escuela
                    esc.IdEscuela = reader.GetInt32(0);
                    esc.NombreEscuela = reader["nombre"].ToString();
                    lista.Add(esc); // Se agrega cada escuela a la lista
                }
                reader.Close();
                _miConexion.CerrarConexionBd();
            }
            catch (SqlException)
            {
                lista = null;
            }
            catch (NullReferenceException)
            {
                lista = null;
            }
            catch (Exception)
            {
                lista = null;
            }
            finally
            {
                _miConexion.CerrarConexionBd();
            }
            return lista;
        }

        #endregion
    }
}